#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
using namespace std;
//class Solution {
//public:
//    int minSubArrayLen(int target, vector<int> nums) {
//        int ret = 0;
//        int count = 0;
//        for (int left = 0, right = 0; right < nums.size(); right++) {
//            count += nums[right];
//            while (count >= target) {
//                if (ret)
//                    ret = min(ret, right - left + 1);
//                else {
//                    ret = right - left + 1;
//                }
//                count -= nums[left++];
//            }
//        }
//        return ret;
//    }
//};
//class Solution {
//public:
//    int lengthOfLongestSubstring(string s) {
//        int len = 0;
//        int hash[128] = { 0 };
//        for (int left = 0, right = 0; right < s.size(); right++)
//        {
//            hash[s[right]]++;
//            while (hash[s[right]] > 1)
//            {
//                hash[s[left++]]--;
//            }
//            len = max(len, right - left + 1);
//        }
//        return len;
//    }
//};
//int main()
//{
//    Solution s;
//    s.minSubArrayLen(7, { 2,3,1,2,4,3 });
//}
//class Solution {
//public:
//    int minOperations(vector<int> nums, int x) {
//        int target = 0, sum = 0, len = -1;
//        for (auto ch : nums) {
//            target += ch;
//        }
//        target -= x;
//        if (target < 0) {
//            return -1;
//        }
//        for (int left = 0, right = 0; right < nums.size(); right++) {
//            sum += nums[right];
//            while (sum > target) {
//                sum -= nums[left++];
//            }
//            if (sum == target)
//                len = max(len, right - left + 1);
//        }
//        if (len == -1)
//            return -1;
//        else return nums.size() - len;
//    }
////};
//class Solution {
//public:
//    int minOperations(vector<int> nums, int x) {
//        int target = 0, sum = 0, len = -1;
//        for (auto ch : nums) {
//            target += ch;
//        }
//        target -= x;
//        if (target < 0) {
//            return -1;
//        }
//     /*   if (target == 0)
//        {
//            return nums.size();
//        }*/
//        for (int left = 0, right = 0; right < nums.size(); right++) {
//            sum += nums[right];
//            while (left <= right && sum >= target) {
//                if (sum == target)
//                    len = max(len, right - left + 1);
//                sum -= nums[left++];
//            }
//        }
//        if (len == -1) return -1;
//        return nums.size() - len;
//
//    }
//};
//int main()
//{
//    Solution s;
//    s.minOperations({1,2,3},6 );
//}
//class Solution {
//public:
//    int totalFruit(vector<int>& fruits) {
//        int hash[100001] = { 0 };
//        int count = 0, ret = 0, kinds = 0;
//        for (int left = 0, right = 0; right < fruits.size(); right++) {
//            if (hash[fruits[right]] == 0) kinds++;
//            hash[fruits[right]]++;
//            while (kinds > 2) {
//                hash[fruits[left]]--;
//                if (hash[fruits[left]] == 0) {
//                    kinds--;
//                }
//                left++;
//            }
//            ret = max(ret, right - left + 1);
//        }
//        return ret;
//    }
//};
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> ans;
        int count = 0, count2 = 0;
        int hash1[28] = { 0 }, hash2[28] = { 0 };
        for (auto ch : p)
        {
            hash2[ch - 'a']++;
            count2++;
        }
        for (int left = 0, right = 0; right < s.size(); right++)
        {
            hash1[s[right] - 'a']++;
            if (hash1[s[right] - 'a'] <= hash2[s[right] - 'a'])
                count++;
            else
                count--;
            while (right - left + 1 > count2) {
                if (hash1[s[left] - 'a'] <= hash2[s[left] - 'a'])
                    count--;
                else {
                    count++;
                }

                hash1[s[left++] - 'a']--;
            }
            if (count == count2)
                ans.push_back(left);
        }
        return ans;
    }
};
int main()
{
    Solution a;
    a.findAnagrams("cbaebabacd", "abc");
}